using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Interfaces;
using HerGoS.DAO;
using System.Data;
using HerGoS.Administration.Entities;
using HerGoS.Documentos.Exceptions;
using HerGoS.Documentos.Engine;

namespace HerGoS.Documentos.Entities
{
	public class GestorMovimientos
	{
        //public static Movimiento Obtener(int oid)
        //{
        //    try
        //    {
        //        IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
        //        repo.Nombre = "MOVIMIENTOS_SP";
        //        repo.AddParameter("@ACCION", "BYID");
        //        repo.AddParameter("@ID", oid);
        //        DataTable dt = repo.ExecuteDataTable();
        //        Movimiento result = dt.ToGenericList<Movimiento>(MovimientoConverter).FirstOrDefault();
        //        return result;
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new MovimientoGetException(ex);
        //    }		
        //}
        

        public static void Guardar(Movimiento movimiento)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryDocumentosName);
                repo.Nombre = "MOVIMIENTO_PROC";
                repo.AddParameter("@ACCION ", movimiento.Persistencia);
                repo.AddParameter("@ID", movimiento.OID);
                repo.AddParameter("@IDLEGAJODOCUMENTO", movimiento.LegajoDocumento  == null ? (int?) null : movimiento.LegajoDocumento.OID);
                repo.AddParameter("@IDENTIDADORIGEN", movimiento.EntidadOrigen == null ? (int?)null : movimiento.EntidadOrigen.OID);
                //repo.AddParameter("@IDAREAORIGEN", movimiento.AreaOrigen == null ? (int?)null : movimiento.AreaOrigen.OID);
                //repo.AddParameter("@IDPERSONAORIGEN", movimiento.PersonaOrigen == null ? (int?)null : movimiento.PersonaOrigen.OID); ;

                repo.AddParameter("@IDAREAORIGEN", HGSContext.Usuario.Area.OID);
                repo.AddParameter("@IDPERSONAORIGEN", HGSContext.Usuario.OID); ;
                
                repo.AddParameter("@IDPUESTOORIGEN", movimiento.PuestoOrigen == null ? (int?)null : movimiento.PuestoOrigen.OID);
             
                repo.AddParameter("@IDENTIDADDESTINO", movimiento.EntidadDestino == null ? (int?)null : movimiento.EntidadDestino.OID);
                repo.AddParameter("@IDAREADESTINO", movimiento.AreaDestino == null ? (int?)null : movimiento.AreaDestino.OID);
                repo.AddParameter("@IDPUESTODESTINO", movimiento.PuestoDestino == null ? (int?)null : movimiento.PuestoDestino.OID);
                repo.AddParameter("@IDPERSONADESTINO", movimiento.PersonaDestino == null ? (int?)null : movimiento.PersonaDestino.OID);
                repo.AddParameter("@IDTIPOMOVIMIENTO", movimiento.TipoMovimiento == null ? (int?)null : movimiento.TipoMovimiento.OID);
                repo.AddParameter("@IDTIPOACCION", movimiento.TipoAccion == null ? (int?)null : movimiento.TipoAccion.OID);
                repo.AddParameter("@OBSERVACIONES", movimiento.Observaciones);
                repo.AddParameter("@IDACTIVIDAD", movimiento.Actividad == null ? (int?)null : movimiento.TipoAccion.OID);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                movimiento.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();
                
            }
            catch (Exception ex)
            {
                throw new MovimentoSaveException(ex);
            }
        }

        public static void Eliminar(Movimiento movimiento)
        {
            movimiento.Persistencia = EstadoPersistencia.DELETE;
            Guardar(movimiento);
            movimiento.Persistencia = EstadoPersistencia.UPDATE;
            movimiento.Activo = false;
        }

        public static List<CantidadLegajosPorTipoMovDTO> ListarCantidadLegajosPorTipo(int? tipodocumento)
        {

            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "MOVIMIENTOS_SP";
                repo.AddParameter("@ACCION", "CANTPORTIPOMOV");
                repo.AddParameter("@IDTIPOMOV", null);
                repo.AddParameter("@ACTIVO", true);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                repo.AddParameter("@TIPODOCUMENTO", tipodocumento);
                DataTable dt = repo.ExecuteDataTable();
                List<CantidadLegajosPorTipoMovDTO> result = dt.ToGenericList<CantidadLegajosPorTipoMovDTO>(CantidadLegajoDocumentoPorTipoMovConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new MovimientoGetException(ex);
            }
        }




        public static List<LegajoDocumentoPorTipoMovDTO> ConsultarPorTipoMovimento(int tipoMovimiento, int tipodocumento)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "MOVIMIENTOS_SP";
                repo.AddParameter("@ACCION", "LISTADOPORTIPO");
                repo.AddParameter("@IDTIPOMOV", tipoMovimiento);
                repo.AddParameter("@ACTIVO", true);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                repo.AddParameter("@TIPODOCUMENTO", tipodocumento);
                DataTable dt = repo.ExecuteDataTable();
                List<LegajoDocumentoPorTipoMovDTO> result = dt.ToGenericList<LegajoDocumentoPorTipoMovDTO>(LegajoDocumentoPorTipoMoConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new MovimientoGetException(ex);
            }
        }

        public static List<MovimientosPorLegajoDTO> ConsultarMovimientosPorLegajo(int idLegajo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "MOVIMIENTOS_SP";
                repo.AddParameter("@ACCION", "MOVPORLEGAJOID");
                repo.AddParameter("@IDTIPOMOV", null);
                repo.AddParameter("@IDLEG", idLegajo);
                repo.AddParameter("@ACTIVO", true);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<MovimientosPorLegajoDTO> result = dt.ToGenericList<MovimientosPorLegajoDTO>(MovimientosPorLegajoDTOConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new MovimientoGetException(ex);
            }
        }


        public static int ObtenerEstado(int idmov)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "OBTENERESTADODOCUMENTO_SP";
                repo.AddParameter("@IDMOV", idmov);
                repo.AddParameter("@ACTIVO", true);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                                
                int? id  =  (int?)repo.ExecuteScalar();

                return (id ?? 0);

             }
            catch (Exception ex)
            {
                throw new MovimientoGetException(ex);
            }
        }



        #region Converters
  
        #region MovimientosPorLegajoDTOConverter
        public static MovimientosPorLegajoDTO MovimientosPorLegajoDTOConverter(DataRow row)
        {
            return new MovimientosPorLegajoDTO
            {
                OID = row["movID"].ToInteger(),
                FechaMov = row["FECHA_INSERT"].ToDateTime().ToString("dd/MM/yyyy HH:mm"),
                EntidadOrigen = row["ENTIDADORIGEN"].ToString(),
                AreaOrigen = row["AREAORIGEN"].ToString(),
                PersonaOrigen = row["PERSONAORIGEN"].ToString(),
                EntidadDestino = row["ENTIDADDESTINO"].ToString(),
                AreaDestino = row["AREADESTINO"].ToString(),
                PersonaDestino = row["PERSONADESTINO"].ToString(),
                TipoAccion = row["taccDESCRIPCION"].ToString(),
                TipoMovimiento = row["tmovDESCRIPCION"].ToString(),
                NumeroDocumento = row["docNUMERO"].ToString(),
            };

        }


        #endregion

        #region CantidadLegajosPorTipoMovDTOConverter
        public static CantidadLegajosPorTipoMovDTO CantidadLegajoDocumentoPorTipoMovConverter(DataRow row)
        {
            return new CantidadLegajosPorTipoMovDTO
            {
                OID = row["tmovID"].ToInteger(),
                DescripcionTipoMov = row["tmovDESCRIPCION"].ToString(),
                CantidadMov = row["CANTIDAD"].ToInteger(),
                //Estado = ObtenerEstado(row["tmovID"].ToInteger())

            };

        }


        #endregion


        #region LegajoDocumentoPorTipoMovConverter
        public static LegajoDocumentoPorTipoMovDTO LegajoDocumentoPorTipoMoConverter(DataRow row)
         {
             return new LegajoDocumentoPorTipoMovDTO
               {
                   OID = row["lvdID"].ToInteger(),
                   Persistencia = EstadoPersistencia.UPDATE,
                   NroLegajo = row["NROLEG"].ToString(),
                   TipoDocumento = row["tdocDESCRIPCION"].ToString(),
                   Tema = row["ttemDESCRIPCION"].ToString(),
                   EntidadEmisora = row["entDENOMINACION"].ToString(),
                   Referencia = row["docREFERENCIA"].ToString(),
                   Descripcion = row["docDESCRIPCION"].ToString(),
                   FechaMov = row["movFECHAMOV"].ToDateTime(),
                   Activo = true

               };
           
          }
        #endregion


	
 
        #endregion
	}
}